#include "threads_Semaphores.h"

int inicia(int valor,key_t clave)
{
int id;
union semun {
  int val;
  struct semid_ds *buf;
  ushort *array;
} estrucSem;

  if ((id=semget(clave, 1, (IPC_CREAT|0666))) == -1) {
    perror("Error al crear el semaforo.");
    return(-1);
  }

  estrucSem.val = valor;
  if (semctl(id, 0, SETVAL, estrucSem) == -1) {
    perror("Error al inicializar el semaforo.");
    return (-1); /*error en inicializacion*/
  }
  return(id);
}

void down(int semaforo)
{
  if ( semcall(semaforo, -1) == -1 )
    perror("Error en operacion P.");
}

void up(int semaforo)
{
  if ( semcall(semaforo, 1) == -1 )
    perror("Error en operacion V.");
}

int semcall(int semaforo, int operacion)
{
  struct sembuf sb;
  sb.sem_num = 0;
  sb.sem_op = operacion;
  sb.sem_flg = 0;

  return ( semop(semaforo, &sb, 1) ); /*devuelve -1 si error */
}

int borra_sem(int semaforo)
{

  if ( semctl(semaforo, 0, IPC_RMID, 0) == -1) {
    perror("Error al eliminar el semaforo.");
    return -1;
  }
return 0;
}
